/**
 * res.end() 用于返回数据
 */
const handleBlogRouter = require('./src/router/blog'); // 处理博客路由
const handleUserRouter = require('./src/router/user'); // 处理用户路由
const querystring = require('querystring'); // 处理请求参数内置
const { get, set} = require('./src/db/redis')
const { accessLog } = require('./src/utils/log')

// session 数据（用于保存登录信息）
// const SESSION_DATA = {};

// 回调函数
const serverHandler = (req, res) => {
    // cros 解决跨域，这里是nginx解决的，这里只是写下来做个记录
    //res.setHeader('Access-Control-Allow-Credentials', true) // 允许跨域传递 cookie
    //res.setHeader('Access-Control-Allow-Origin', '*') // 允许跨域的 origin ，* 代表所有的，谨慎使用
    // res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8001') // 允许单个 origin ，可通过前端 JS location.origin 获取
    //res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE') // 允许的 method

    // 开始记录访问日志
    accessLog(`${req.method} -- ${req.url} -- ${req.headers['user-agent']} -- ${Date.now()}`);

    // 设置响应格式为JSON
    res.setHeader('Content-Type', 'application/json');

    req.path = req.url.split('?')[0];
    req.query = querystring.parse(req.url.split('?')[1] || ''); // 请求参数.

    // 获取cookie 处理它
    // 注意解析cookie时，会有空格的情况，需要trim()去掉空格
    req.cookie = {};
    const cookieStr = req.headers.cookie; // cookie字符串
    cookieStr.split(';').forEach(item => {
        if (!item) {
            return;
        }
        const arr = item.split('=');
        const key = arr[0].trim();
        const value = arr[1].trim();
        req.cookie[key] = value; // 赋值
    })
    console.log('req.cookie', req.cookie);

    // // 解析 session
    // let needSetCookie = false
    // let userId = req.cookie.userId    
    // if (userId) {
    //     if (!SESSION_DATA[userId]) {
    //         SESSION_DATA[userId] = {}
    //     }
    // } else {
    //     needSetCookie = true
    //     userId = `${Date.now()}_${Math.random()}`
    //     SESSION_DATA[userId] = {}
    // }
    // req.session = SESSION_DATA[userId]

    // 解析session （使用redis）
    let needSetCookie = false
    let userId = req.cookie.userId
    if (!userId) {
        needSetCookie = true
        userId = `${Date.now()}_${Math.random()}`
        set(userId, {})
    } 
    // 获取session
    req.sessionId = userId
    // ------------------ 踩坑 ---------------------------------------------
    // ----------------- 这里两个异步操作，需要.then来处理--------------------
    // ------------------ 踩坑 ---------------------------------------------
    get(req.sessionId).then(sessionData => {
        if (sessionData == null) {
            // 初始化 redis 中的 session 值
            set(req.sessionId, {})
            // 设置 session
            req.session = {}
        } else {
            // 设置 session
            req.session = sessionData
        }
        console.log('req.session ', req.session)
        console.log('req url:', req.url)
        
     // 处理 post data
     return getPostData(req)
    }).then(postData => { 
        req.body = postData; // 将post请求的数据赋值给req.body

        // 处理博客路由
        const blogResult = handleBlogRouter(req, res);
        if (blogResult) {
            if (needSetCookie) {
                // 设置cookie
                res.setHeader('Set-Cookie', `userId=${userId}; path=/; httpOnly; expires=${getCookieExpires()}`);
            }

            blogResult.then(blogData => {
                res.end(JSON.stringify(blogData));
            });
            return;
        }

        // 处理用户路由
        const result = handleUserRouter(req, res);
        if (result) {
            if (needSetCookie) {
                // 设置cookie
                res.setHeader('Set-Cookie', `userId=${userId}; path=/; httpOnly; expires=${getCookieExpires()}`);
            }

            result.then(userData => {
                res.end(JSON.stringify(userData));
            })
            return;
        }

        // 未命中路由，返回404
        res.writeHead(404, { 'Content-Type': 'text/plain' });
        const resData = { error: '404 Not Found' };
        res.end(JSON.stringify(resData));
    })
}

// 接收 post 请求中的数据（用promise来解析，返回的是一个promise对象）
const getPostData = (req) => {
    const promise = new Promise((resolve, reject) => {
        if (req.method !== 'POST') {
            resolve({}); // 返回空
            return;
        }
        if (req.headers['content-type'] !== 'application/json') {
            resolve({}); // 返回空
            return;
        }

        let postData = '';
        req.on('data', chunk => {
            postData += chunk.toString();
        });
        req.on('end', () => {
            if (!postData) {
                resolve({}); // 如果接收的数据为空，返回空
            }
            resolve(JSON.parse(postData)); // 有数据
        })
    })
    return promise;
}

// 设置cookie的过期时间
// 设置一天后过期
const getCookieExpires = () => {
    const d = new Date()
    d.setTime(d.getTime() + (24 * 60 * 60 * 1000))
    return d.toGMTString()
  }

// 导出回调函数
module.exports = serverHandler